const { app, dialog, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const fs = require('fs');
const os = require('os');
const axios = require('axios');
const unzipper = require('unzipper');

let mainWindow;
const agreement = 'hiwi-app';

function setDefaultProtocol() {
    let isSet = false;
    app.removeAsDefaultProtocolClient(agreement);

    if (process.platform === 'win32') {
      const resolvedPath = process.argv[1] ? path.resolve(process.argv[1]) : '';
      isSet = app.setAsDefaultProtocolClient(agreement, process.execPath, [resolvedPath]);
    } else {
        isSet = app.setAsDefaultProtocolClient(agreement, process.execPath);
    }

    console.log('是否注册成功', isSet);
}

function watchProtocol() {
    const AGREEMENT_REGEXP = new RegExp(`^${agreement}://`);

    app.on('open-url', (event, url) => {
        event.preventDefault();
        const isProtocol = AGREEMENT_REGEXP.test(url);
        if (isProtocol) {
            console.log('获取协议链接:', url);
        }
    });

    app.on('second-instance', (event, commandLine) => {
        commandLine.forEach((str) => {
            if (AGREEMENT_REGEXP.test(str)) {
                console.log('获取协议链接:', str);
                dialog.showMessageBox({
                    type: 'info',
                    message: 'Windows 自定义协议打开',
                    detail: `自定义协议链接: ${str}`,
                });
            }
        });
    });
}
// 注册并监听自定义协议
setDefaultProtocol();
watchProtocol();
// 创建窗口并加载 HTML 页面
function createWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: true,
      contextIsolation: false,
    },
  });

  mainWindow.loadFile('views/index.html');

  // 当窗口加载完成后执行下载和解压逻辑
  mainWindow.webContents.on('did-finish-load', () => {
    main();
  });
}

// 向窗口发送日志
function sendLog(message) {
  if (mainWindow && mainWindow.webContents) {
    mainWindow.webContents.send('log', message);
  }
}

// 下载文件
async function downloadFile(url, filePath) {
  sendLog('1、开始下载文件...');
  const response = await axios({
    url: url,
    method: 'GET',
    responseType: 'stream',
  });

  return new Promise((resolve, reject) => {
    const writer = fs.createWriteStream(filePath);
    response.data.pipe(writer);
    writer.on('finish', () => {
      sendLog('2、文件下载完成');
      resolve();
    });
    writer.on('error', reject);
  });
}

// 获取系统路径
function getSystemPath() {
  const platform = os.platform();
  if (platform === 'win32') {
    return path.join(os.homedir(), 'AppData', 'Local', 'HiwiApp', 'app');
  } else if (platform === 'darwin') {
    return path.join(os.homedir(), 'Library', 'Application Support', 'HiwiApp', 'app');
  }
  // if (platform === 'win32') {
  //   return path.join('C:', 'ProgramData', 'HiwiApp'); // 公共数据目录
  // } else if (platform === 'darwin') {
  //   return path.join('/', 'Library', 'Application Support', 'HiwiApp'); // macOS 支持
  // } else {
  //   return path.join('/var', 'lib', 'HiwiApp'); // Linux 支持
  // }
}

// 递归删除文件夹及其内容
// function deleteFolderRecursive(folderPath) {
//   if (fs.existsSync(folderPath)) {
//     fs.readdirSync(folderPath).forEach((file) => {
//       const currentPath = path.join(folderPath, file);
//       if (fs.lstatSync(currentPath).isDirectory()) {
//         // 递归删除子文件夹
//         deleteFolderRecursive(currentPath);
//       } else {
//         // 删除文件
//         fs.unlinkSync(currentPath);
//       }
//     });
//     fs.rmdirSync(folderPath); // 删除文件夹本身
//   }
// }

// 解压并重命名
async function extractAndRename(zipPath, extractTo) {
  // sendLog(`3、正在解压文件到: `);
  sendLog(`${extractTo}`);
  await fs.createReadStream(zipPath)
    .pipe(unzipper.Extract({ path: extractTo }))
    .promise();

  // 获取解压文件夹中的所有内容
  const files = fs.readdirSync(extractTo);
  const extractedFolder = files.find(file => fs.lstatSync(path.join(extractTo, file)).isDirectory());
  if (extractedFolder) {
    // const oldPath = path.join(extractTo, extractedFolder);
    // const newPath = path.join(extractTo, 'hiwi');

    // // 如果目标文件夹 hiwi 已存在，先删除它
    // if (fs.existsSync(newPath)) {
    // //   sendLog(`目标文件夹 ${newPath} 已存在，正在删除...`);
    //   deleteFolderRecursive(newPath);
    // //   sendLog(`已删除旧的 ${newPath}`);
    // }

    // 重命名文件夹
    // fs.renameSync(oldPath, newPath);
    // sendLog(`文件已解压并重命名为: ${newPath}`);

    // 删除压缩包文件
    fs.unlinkSync(zipPath);
    sendLog(`3、插件已更新！`);
    // sendLog(`5、温馨提示：`);
    // sendLog(`本插件的安装路径为：${extractTo}/hiwi，如果您要卸载该插件，只需要删除${extractTo}这个文件夹即可，本插件占用内存不到20mb，不会占用您过多的内存，无需担心内存问题`);
    // sendLog(`已删除下载的压缩包: ${zipPath}`);
  } else {
    sendLog('没有找到解压后的文件夹');
  }
}

// 主流程
async function main() {
  const url = 'https://open.cloudycentury.net:89/pyplugins/chromePluginsTmall/getChromePluginFile';
  const systemPath = getSystemPath();
  const zipPath = path.join(systemPath, 'plugin.zip');

  // 创建文件夹
  if (!fs.existsSync(systemPath)) {
    fs.mkdirSync(systemPath, { recursive: true });
  }

  try {
    // 下载文件
    await downloadFile(url, zipPath);

    // 解压并重命名
    await extractAndRename(zipPath, systemPath);
        // 导入 cors 模块
        const cors = require("cors");

        // 引入 express 模块
        const express = require('express');
        // 创建 HTTP 服务器
        const server = express();
        server.use(cors());
        server.get('/status', (req, res) => {
          // 模拟执行一些操作
          res.send({ status: 'success' });
        });

      server.listen(7777, () => {
        console.log('HTTP 服务器运行在 http://localhost:7777');
      });
      // 显示 10 秒后自动关闭的提示
      sendLog('10秒后自动关闭应用...');

    // 10秒后关闭应用
    setTimeout(() => {
        // 关闭server
        // server.close();
        app.quit(); // 关闭应用程序
    }, 10000); // 10秒 = 10000毫秒
  } catch (error) {
    sendLog(`发生错误: ${error.message}`);
  }
}

// 当 Electron 准备好时创建窗口
app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});